11
תגובות
יש לי קובץ PHP עם הקוד הבא:
עכשיו כשאני נכנס לתוך הקובץ הוא כמובן נותן לי הורדה למסמך הword שנבנה, אבל זה רק כאשר המשתמש ניגש לקובץ דרך הדפדפן, לעומת זאת אני מעוניין לקחת את המסמך word שנבנה ולא לתת למשתמש להוריד אותו אלה להכניס אותו לתוך קובץ zip (ziparchive class) ביחד עם עוד כמה דברים.
<?php
header("Content-type: application/vnd.ms-word");
header("Content-Disposition: attachment;Filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<b>My first document</b>";
echo "</body>";
echo "</html>";
?>
header("Content-type: application/vnd.ms-word");
header("Content-Disposition: attachment;Filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<b>My first document</b>";
echo "</body>";
echo "</html>";
?>
עכשיו כשאני נכנס לתוך הקובץ הוא כמובן נותן לי הורדה למסמך הword שנבנה, אבל זה רק כאשר המשתמש ניגש לקובץ דרך הדפדפן, לעומת זאת אני מעוניין לקחת את המסמך word שנבנה ולא לתת למשתמש להוריד אותו אלה להכניס אותו לתוך קובץ zip (ziparchive class) ביחד עם עוד כמה דברים.
11 תשובות
בקמקום לשלוח את הקובץ doc תייצר קובץ zip במקום ותשלח אותו.
<?php
$zip = new ZipArchive();
if($zip->open("someName.zip",ZIPARCHIVE::CREATE)===TRUE)
{
// הוספת קובץ לתוך הזיפ
$zip->addFile("document_name.doc");
$zip->close();
// סגירת הזיפ
}
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=someName.zip");
$zip = new ZipArchive();
if($zip->open("someName.zip",ZIPARCHIVE::CREATE)===TRUE)
{
// הוספת קובץ לתוך הזיפ
$zip->addFile("document_name.doc");
$zip->close();
// סגירת הזיפ
}
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=someName.zip");
יצירת קבצי zip עם PHP
אם אתה צריך, קודם צור בנפרד את הקובץ word
file_put_contents('word.doc', "
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
אפשר לחסוך את הפעולה השניה ולעשות הכל ביחד:
$zip = new ZipArchive();
if($zip->open("someName.zip",ZIPARCHIVE::CREATE)===TRUE)
{
// הוספת קובץ לתוך הזיפ
$zip->addFromString("document_name.doc", "
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
$zip->close();
// סגירת הזיפ
}
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=someName.zip");
if($zip->open("someName.zip",ZIPARCHIVE::CREATE)===TRUE)
{
// הוספת קובץ לתוך הזיפ
$zip->addFromString("document_name.doc", "
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
$zip->close();
// סגירת הזיפ
}
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=someName.zip");
אל תשכח למחוק את הקובץ שיווצר בסוף הסקריפט ולתת לקובץ שם רנדומלי כדי ששני משתמשים בבת אחת יוכלו להשתמש במערכת.
אפשר גם ללכת שלב אחד רחוק יותר ולהשתמש בספריית ZIP שלא שומרת קבצים בדיסק אלא בזיכרון בלבד.
הוא עכשיו לצערי מחרבש לי שמות בעברית. נגיד יש לי קובץ "מילים.doc" הוא יוצר אותו בארכיון כ"___??&__.doc" או משהו בסגנון (אך כל התוכן של הקובץ לא נפגע)
כן. מחיפוש קצר בגוגל עולה שצריך לעשות המרת קידוד:
$name = "שם בעברית.doc";
$zip->addFromString(iconv("UTF-8","CP862",$name), "
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
$zip->addFromString(iconv("UTF-8","CP862",$name), "
<html>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">
<body>
<b>My first document</b>
</body>
</html>
");
קח בחשבון שזו רק דרך לעקוף את זה, אבל הבעיה היא לא אצלך. בגרסת zip 1.11.0 (מ-PECL) תוקנה הבעיה עם קידוד UTF-8.